package modelo.dao;

import java.sql.*;

public class Servidor {
	private static Servidor _instancia = null;
	
	private DAOClientes _clientes = new DAOClientes();
	private DAOEmpleados _empleados = new DAOEmpleados();
	private DAOEquipos _equipos = new DAOEquipos();
	private DAOEstados _estados = new DAOEstados();
	private DAOImpuestos _impuestos = new DAOImpuestos();
	private DAOMateriales _materiales = new DAOMateriales();
	private DAOOrdenesCobranza _ordCobranza = new DAOOrdenesCobranza();
	private DAOServicios _servicios = new DAOServicios();
	private DAOServiciosPrestados _servPrestados = new DAOServiciosPrestados();
	private DAOTareas _tareas = new DAOTareas();
	private DAOSolicitud _solicitudes = new DAOSolicitud();
	
	private Connection _conexion = null;
	//private Date _ultimaAccion;
	
	private static String _bd_driver = "org.postgresql.Driver";
	private static String _bd_url = "jdbc:postgresql://localhost:5432/";
	private static String _bd_name = "SiGeS";
	private static String _bd_user = "postgres";
	private static String _bd_password = "18431266";

    
	private Servidor() {
		super();

		/*new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					while (true) {
						this.wait(1000);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});*/
	}
	
	public void iniciar() {
		_estados.cargarEstados();
		_estados.cargarCiudades();

		_clientes.cargarClientes();
		_clientes.cargarSucursales();

		_empleados.cargarEmpleados();
		
		_impuestos.cargarImpuestos();
		
		_equipos.cargarMarcas();
		_equipos.cargarModelos();
		_equipos.cargarEquipos();
		
		_materiales.cargarMateriales();
		
		_tareas.cargarTareas();

		_servicios.cargarEstadosServicio();
		_servicios.cargarTiposServicio();
		_servicios.cargarServicios();
		_servicios.cargarTareasServicio();
		_servicios.cargarMaterialesServicio();

		_solicitudes.cargarSolicitudes();
		_solicitudes.cargarDetallesSolicitud();
		
		_ordCobranza.cargarOrdenesCobranza();
		
		_servPrestados.cargarServiciosPrestados();
		_servPrestados.cargarTareasAsignadas();
	}
	
	public void terminar() {
		
	}
	
	private void getConexion() {
		try {
    		if (_conexion == null || _conexion.isClosed()) {	        
	            Class.forName(_bd_driver);
	            _conexion = DriverManager.getConnection(_bd_url + _bd_name, _bd_user, _bd_password);
	        }
    	} catch(SQLException e){
        	e.printStackTrace();
        } catch (ClassNotFoundException e) {
        	e.printStackTrace();
		}
	}
	
	public static ResultSet consultar(String sql) {
		instancia().getConexion();

		try {
			Statement sentencia = instancia()._conexion.createStatement();
        	ResultSet resultado = sentencia.executeQuery(sql);            
        	instancia()._conexion.close();
        	return resultado;
        } catch (SQLException e) {
        	System.out.println("Sentencia SQL:");
        	System.out.println(sql);
        	e.printStackTrace();
        }
        
    	return null;
	}
	
	public static boolean ejecutar(String sql) {
		instancia().getConexion();

		try {
			Statement sentencia = instancia()._conexion.createStatement();
			boolean ret = sentencia.executeUpdate(sql) > 0; 
    		sentencia.close();
    		instancia()._conexion.close();
    		return ret;
        } catch (SQLException e) {
        	System.out.println("Sentencia SQL:");
        	System.out.println(sql);
        	e.printStackTrace();
        }

        return false;
	}

	public static Servidor instancia() {
		if (_instancia == null)
			_instancia = new Servidor();
		return _instancia;
	}
	
	public static DAOClientes clientes() {
		return instancia()._clientes;
	}
	
	public static DAOEmpleados empleados() {
		return instancia()._empleados;
	}
	
	public static DAOEquipos equipos() {
		return instancia()._equipos;
	}
	
	public static DAOEstados estados() {
		return instancia()._estados;
	}
	
	public static DAOImpuestos impuestos() {
		return instancia()._impuestos;
	}
	
	public static DAOMateriales materiales() {
		return instancia()._materiales;
	}
	
	public static DAOServicios servicios() {
		return instancia()._servicios;
	}
	
	public static DAOServiciosPrestados serviciosPrestados() {
		return instancia()._servPrestados;
	}
	
	public static DAOTareas tareas() {
		return instancia()._tareas;
	}
	
	public static DAOOrdenesCobranza ordenesCobranza() {
		return instancia()._ordCobranza;
	}
	
	public static DAOSolicitud solicitudes() {
		return instancia()._solicitudes;
	}
}
